#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

//定义双链表节点类型
typedef struct DNode
{
    ElemType data;//数据域
    struct DNode *prior,*next;//前驱和后继指针
}DNode, *DLinkList;

//双链表的初始化（带头节点）
//初始化双链表
bool InitDLinkList(DLinkList &L)
{
    L=(DNode*)malloc(sizeof(DNode));//分配一个头结点
    if(L==NULL)//内存不足，分配失败
        return false;
    L->prior=NULL;//头结点的prior永远指向NULL
    L->next=NULL;//头结点之后暂时还没有节点
    return true;
}

void testDLinkList()
{
    //初始化双链表
    DLinkList L;
    InitDLinkList(L);
    //....
}

//判断双链表是否为空（带头节点）
bool Empty(DLinkList L)
{
    if(L->next == NULL)
        return true;
    else
        return false;
}

//双链表的插入
//在p节点之后插入插入s节点
bool InsertNextDNode(DNode* p, DNode *s)
{
    if(p==NULL || s==NULL)
        return false;
    s->next=p->next;
    if(p->next != NULL)
    {
        p->next->prior=s;
    }
    s->prior=p;
    p->next=s;
    return true;
}

//双链表的删除
//删除p节点的后继节点
bool DeleteNextDNode(DNode* p)
{
    if(p==NULL)
        return false;
    DNode *q = p->next; // 找到p的后继结点q
    if(q==NULL)
        return false;  //p没有后继
    p->next=q->next;
    if(q->next!=NULL) //q节点不是最后一个节点
        q->next->prior=p;
    free(q);//释放节点空间
    return true;
}

//循环释放各个数据节点
void DestroyList(DLinkList &L)
{
    while (L->next != NULL)
        DeleteNextDNode(L);
    free(L);//释放头结点
    L=NULL;//头指针指向NULL
}







